package com.kuangstudy.service.set;

import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;
import java.util.ArrayList;
import java.util.List;

/**
 * @author 飞哥
 * @Title: 学相伴出品
 * @Description: 我们有一个学习网站：https://www.kuangstudy.com
 * @date 2021/5/23 16:12
 */
@Service
@Log4j2
public class BlackUserListService {

    @Autowired
    private RedisTemplate redisTemplate;

    final String BLACK_LIST_KEY = "blacklist:set";

    // 1: 把数据库中的黑名单的用户信息放入到redis中
    @PostConstruct
    public void initBlackList() {
        log.info("名单启动初始化黑....");
        // 1: 把数据库的黑名单的用户ID全部查询
        List<Integer> blackList = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            blackList.add(i + 1);
        }
        // 2: 把黑名单的清单放入到redis的set集合中
        blackList.forEach(user -> this.redisTemplate.opsForSet().add(BLACK_LIST_KEY, user));
    }

    // 2: 添加用户到黑名单中和数据DB中,比如举报
    public void addBlackList(Integer userid) {
        log.info("添加用户黑名单....");
        // 1: 把用户ID添加到黑名单数据库DB中
        // 2: 同时黑名单的set中也添加一份
        if (!this.redisTemplate.opsForSet().isMember(BLACK_LIST_KEY, userid)) {
            this.redisTemplate.opsForSet().add(BLACK_LIST_KEY, userid);
        }
    }


    // 3: 判断当前用户是否在黑名单中
    public boolean isBlackList(Integer userid) {
        log.info("添加用户黑名单....");
        boolean flag = false;
        try {
            flag = this.redisTemplate.opsForSet().isMember(BLACK_LIST_KEY, userid);
        } catch (Exception ex) {
            // 这里出现异常一般指你的redis服务崩溃或者服务器链接超时或者一些不可抗的因素
            log.error("出现异常", ex.getMessage());
            // todo 可以考虑数据库对比一次
        }
        return flag;
    }

    // 4: 删除黑名单
    public boolean removeBlackList(Integer userid) {
        log.info("添加用户黑名单....");
        boolean flag = false;
        try {
            // 1：移除redis黑名单
            Long remove = this.redisTemplate.opsForSet().remove(BLACK_LIST_KEY, userid);
            // 2：移除数据库DB黑名单
            // todo
            flag = remove > 0;
        } catch (Exception ex) {
            log.error("出现异常", ex.getMessage());
        }
        return flag;
    }
}
